/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.seguridad;

import java.util.Calendar;
import java.util.Date;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PostUpdateEventListener;
import muhnes.sizoo.dal.BitacoraDao;
import muhnes.sizoo.dal.BitacoraDaoImpl;
import muhnes.sizoo.modelo.Bitacora;
import muhnes.sizoo.seguridad.IAuditable;

public class CRUDListener implements PostInsertEventListener, 
                                     PostUpdateEventListener, 
                                     PostDeleteEventListener {

    @Override
    public void onPostInsert( PostInsertEvent evento ) {
        
        Object entidad = evento.getEntity();
        if( entidad instanceof IAuditable  ) {
            registrarAccion( "Agregar", (IAuditable)entidad );
        }
        
    }

    @Override
    public void onPostUpdate( PostUpdateEvent evento ) {
        
        Object entidad = evento.getEntity();
        if( entidad instanceof IAuditable  ) {
            registrarAccion( "Actualizar", (IAuditable)entidad );
        }
        
    }
    
    @Override
    public void onPostDelete( PostDeleteEvent evento ) {
        
        Object entidad = evento.getEntity();
        if( entidad instanceof IAuditable  ) {
            registrarAccion( "Eliminar", (IAuditable)entidad );
        }
        
    }
    
    private void registrarAccion( String accion, IAuditable entidad ) {
        
        String usuario = FacesContext.getCurrentInstance()
                             .getExternalContext().getRemoteUser();
            
            String tablaAfectada = entidad.getNombreAuditable();
            
            Date fecha = Calendar.getInstance().getTime();
            
            Date hora = Calendar.getInstance().getTime();
            
            String ip = ((HttpServletRequest) FacesContext.getCurrentInstance()
                        .getExternalContext().getRequest())
                        .getRemoteAddr();
            
            Bitacora registro = new Bitacora();
            //registro.setCorreousuario( usuario );
            registro.setAccionrealizada( accion );
            registro.setTablaafectada( tablaAfectada );
            registro.setFecha( fecha );
            registro.setHora( hora );
            registro.setIp( ip );
            
            BitacoraDao dao = new BitacoraDaoImpl();
            dao.guardar( registro );
        
    }
    
}
